/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cursoexperto.jftf.jsf.pack;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.el.ELContext;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cursoexperto.jftf.controller.ClienteJpaController;
import org.cursoexperto.jftf.entidades.Cliente;
import org.cursoexperto.jftf.controller.exceptions.NonexistentEntityException;
import org.cursoexperto.jftf.controller.exceptions.PreexistingEntityException;

/**
 *
 * @author Jose Fernando
 */
public class ClienteController {

    public ClienteController() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        jpaController = (ClienteJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "clienteJpa");
        logged = false;
    }
    private Cliente cliente = null;
    private ClienteJpaController jpaController = null;
    private boolean logged;

    public Cliente getCliente() {
        if (cliente == null) {
            setCliente(new Cliente());
        }
        return cliente;
    }

    /**
     * Accion para registrar un nuevo cliente en el sistema
     * @return Devuelve la redirección
     */
    public String registro() {
        if (!isLogged()) {
            if (jpaController.findByUsuario(cliente.getUsuario()) == null) {
                try {
                    jpaController.create(cliente);
                } catch (PreexistingEntityException ex) {
                    Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    return "fail";
                } catch (Exception ex) {
                    Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    return "fail";
                } finally {
                    cliente = null;
                }
            } else {
                FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "El usuario " + cliente.getUsuario() + " ya existe", "El usuario " + cliente.getUsuario() + " ya existe");
                FacesContext.getCurrentInstance().addMessage(null, facesMsg);
                cliente.setUsuario("");
                return "fail";
            }
        }
        return "success";
    }

    public String login() {
        Cliente cli = jpaController.findByUsuario(cliente.getUsuario());
        if (cli != null) {
            if (cli.getPassword().equals(cliente.getPassword())) {
                setLogged(true);
                cliente = cli;
            } else {
                FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Password incorrecta", "Password incorrecta");
                FacesContext.getCurrentInstance().addMessage("loginForm", facesMsg);
                cliente.setUsuario(null);
                return "logout";
            }
        } else {
            FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "El usuario no existe", "El usuario no existe");
            FacesContext.getCurrentInstance().addMessage("loginForm", facesMsg);
            cliente.setUsuario(null);
            return "logout";
        }
        return "login";
    }

    public String logout() {
        if (isLogged()) {
            setLogged(false);
            setCliente(null);
            ELContext elContext = FacesContext.getCurrentInstance().getELContext();
            CarritoController c = (CarritoController) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "carrito");
            if (c != null) {
                c.resetCarrito();
            }
        }
        return "logout";
    }

    /**
     * Accion para editar los datos de un cliente existente
     * @return Devuelve la redirección
     */
    public String edicionCliente() {
        if (isLogged()) {
            //Cliente cli = jpaController.findByUsuario(cliente.getUsuario());
            //cli.setPassword(cliente.getPassword());
            try {
                jpaController.edit(cliente);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(ClienteController.class.getName()).log(Level.SEVERE, null, ex);
                return "edicionClienteIncorrecta";
            } catch (Exception ex) {
                Logger.getLogger(ClienteController.class.getName()).log(Level.SEVERE, null, ex);
                return "edicionClienteIncorrecta";
            }
        }
        return "edicionClienteCorrecta";

    }

    /**
     * @return the logged
     */
    public boolean isLogged() {
        return logged;
    }

    /**
     * @param logged the logged to set
     */
    public void setLogged(boolean logged) {
        this.logged = logged;
    }

    /**
     * @param cliente the cliente to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
}
